"""
项目简介
冒泡排序

知识模块
Python 编程语言
知识点
参数说明
条件语句 if-else
循环嵌套
列表操作
判断
受众
初级测试开发工程师
初级Python开发工程师
作业要求
编写一个Python程序，实现冒泡排序。

解题思路
获取待排序列表的长度，用于确定外层循环的次数。

外层循环：从第一个元素开始，遍历到倒数第二个元素，每次循环找到剩余元素中的最大值。

内层循环：在每次外层循环时，从第一个元素开始，遍历到倒数第 i+1 个元素，比较相邻的两个元素的大小。

根据是否指定了比较键 key 来确定比较的方式。

继续进行内层循环，直到所有的元素都经过比较和交换。

完成外层循环后，列表已经按照指定的顺序进行了排序。

根据 reverse 的值确定返回的排序结果：

"""

# def bubble_sort(arr):
#     n = len(arr)
#     # 遍历所有数组元素
#     for i in range(n):
#         # 最后 i 个元素已经排好序，不需要再比较
#         for j in range(0, n - i - 1):
#             # 如果当前元素大于下一个元素，则交换它们
#             if arr[j] > arr[j + 1]:
#                 arr[j], arr[j + 1] = arr[j + 1], arr[j]
#     return arr
#
# # 测试
# arr = [64, 34, 25, 12, 22, 11, 90]
# sorted_arr = bubble_sort(arr)
# print("排序后的数组:", sorted_arr)


def bubble_sort(lt,reverse=False):
    n = len(lt)

    for i in range(n):
        for j in range(0,n-i-1):
            if lt[j] > lt[j+1]:
                lt[j],lt[j+1] = lt[j+1], lt[j]


    if reverse:
        return lt[::-1]
    else:
        return lt


# 测试
arr = [64, 34, 25, 12, 22, 11, 90]
sorted_arr = bubble_sort(arr,True)
print("排序后的数组:", sorted_arr)





# def bubbleSort(obj, key=None, reverse=False):
#     length = len(obj)
#     # 外层循环用来确定找出剩余数据的最大值，N个数，找n-1次即可
#     for i in range(length-1):
#         for j in range(length-i-1):
#             if key:  # if key != None:
#                 if key(obj[j]) > key(obj[j + 1]):
#                     obj[j], obj[j + 1] = obj[j + 1], obj[j]
#             else:
#                 if obj[j] > obj[j+1]:
#                     obj[j], obj[j+1] = obj[j+1], obj[j]
#     # return obj if not reverse else obj[::-1]
#     if reverse:
#         return obj[::-1]
#     else:
#         return obj


"""
首先定义了一个名为 bubbleSort 的函数，用于实现冒泡排序算法。

bubbleSort 函数接受三个参数：obj、key 和 reverse。其中 obj 是待排序的列表，key 是一个可选的函数参数，用于指定比较的键，reverse 则是一个可选的布尔参数，用于指定排序的顺序。

在函数中，使用 len(obj) 获取待排序列表的长度，即列表中元素的个数。

然后使用外层循环进行迭代，循环次数为数组长度减1。每次循环将找出剩余数据的最大值放在最后的位置。

在外层循环中，使用内层循环从第一个元素开始遍历，直到倒数第 i+1 个元素。通过比较相邻的两个元素的大小，如果前一个元素比后一个元素大，则交换它们的位置，确保较大的元素在后面。

在两个嵌套的循环中，通过判断 key 是否存在，来决定使用哪种比较方式。如果指定了 key，则使用 key(obj[j]) 和 key(obj[j + 1]) 进行比较；否则直接使用元素本身进行比较。

最后，根据 reverse 参数的值确定返回的排序结果。如果 reverse 为 True，则将列表反转后返回，即返回逆向排序的结果，即降序；如果未指定或 reverse 为 False，则直接返回列表，即返回正向排序的结果，即升序。

"""